Le but de ce document est de comparer différents paramètres et différentes méthodes de normalisation pour voir leur impact sur les analyses à postériori. Nous allons comparer 2 méthodes de normalisation :

  • La fonction NormalizeData de Seurat avec différentes valeurs de paramètres
  • La fonction SCTransform du package sctransform

Pour que la comparaison soit pertinente, tous les autres paramètres seront identiques (résolution des clusters, nombre de dimensions, seuil pour l’analyse de gènes DE, etc…)


La normalisation sert à enlever le biais expérimental (capture d’ADNc, amplification PCR, …) entre les cellules qui provoquent des différences de couverture entre les librairies.


# Loading data
seu <- Read10X("data/filtered_feature_bc_matrix/")
data <- CreateSeuratObject(seu)

TSNE

Defaut

Paramètres par défaut de la fonction NormalizeData de seurat. Les comptages de chaque gène et de chaque cellule sont divisés par le nombre total de comptage de gène dans cette cellule puis ce résultat est multiplié par le scale factor (10 000 par défaut) et mis au log.

default <- DimPlot(data_LN, reduction = "tsne")
default

CLR features

On utilise la transformation du Centered Log Ratio sur les gènes. Cela signifie qu’on transforme chaque élément d’un vecteur de gène (de dimension nCells) en se basant sur le logarithme du ratio entre la valeur de cet élément et la moyenne géométrique du vecteur.

clrf <- DimPlot(data_CLR, reduction = "tsne") 
clrf

CLR cells

On utilise la transformation du Centered Log Ratio sur les cellules. Cela signifie qu’on transforme chaque élément d’un vecteur de cellule (de dimension nGenes) en se basant sur le logarithme du ratio entre la valeur de cet élément et la moyenne géométrique du vecteur.

clrc <- DimPlot(data_CLRc, reduction = "tsne")
clrc

Relative count

Les comptages de gènes pour chaque cellule sont divisés par la somme des comptages et multipliés par un scale.factor (ici 1e6 pour avoir des count per millions). Les données ne sont pas mises au log.

rc <- DimPlot(data_RC, reduction = "tsne")
rc

SCTransform

SCTransform se base sur l’observation qu’il semble y avoir une relation linéaire entre le nombre d’UMI et le nombre de gènes détectés dans une cellule. Cette méthode fit un modèle linéaire généralisé avec les UMI en variable à expliquer et la profondeur de séquençage comme variable explicative

sct <- DimPlot(data_SC, reduction = "tsne") 
sct

SCTransform avec GLM

On utilise la même fonction que dans l’onglet SCTransform mais on lui spécifie un autre modèle (GLM Gamma Poisson). C’est supposé réduire le temps de calcul

sctglm <- DimPlot(data_SCGLM, reduction = "tsne")
sctglm

UMAP

Defaut

Paramètres par défaut de la fonction NormalizeData de seurat. Les comptages de chaque gène et de chaque cellule sont divisés par le nombre total de comptage de gène dans cette cellule puis ce résultat est multiplié par le scale factor (10 000 par défaut) et mis au log.

default <- DimPlot(data_LN, reduction = "umap")
default

CLR features

On utilise la transformation du Centered Log Ratio sur les gènes. Cela signifie qu’on transforme chaque élément d’un vecteur de gène (de dimension nCells) en se basant sur le logarithme du ratio entre la valeur de cet élément et la moyenne géométrique du vecteur.

clrf <- DimPlot(data_CLR, reduction = "umap") 
clrf

CLR cells

On utilise la transformation du Centered Log Ratio sur les cellules. Cela signifie qu’on transforme chaque élément d’un vecteur de cellule (de dimension nGenes) en se basant sur le logarithme du ratio entre la valeur de cet élément et la moyenne géométrique du vecteur.

clrc <- DimPlot(data_CLRc, reduction = "umap")
clrc

Relative count

Les comptages de gènes pour chaque cellule sont divisés par la somme des comptages et multipliés par un scale.factor (ici 1e6 pour avoir des count per millions). Les données ne sont pas mises au log.

rc <- DimPlot(data_RC, reduction = "umap")
rc

SCTransform

SCTransform se base sur l’observation qu’il semble y avoir une relation linéaire entre le nombre d’UMI et le nombre de gènes détectés dans une cellule. Cette méthode fit un modèle linéaire généralisé avec les UMI en variable à expliquer et la profondeur de séquençage comme variable explicative

sct <- DimPlot(data_SC, reduction = "umap") 
sct

SCTransform avec GLM

On utilise la même fonction que dans l’onglet SCTransform mais on lui spécifie un autre modèle (GLM Gamma Poisson). C’est supposé réduire le temps de calcul

sctglm <- DimPlot(data_SCGLM, reduction = "umap")
sctglm

Markers

Pour réduire le temps de calcul, on ne s’interessera qu’aux gènes up-régulés et avec un LogFC > 0.5

upset(df, sets = c("ln", "clrf", "clrc", "rc", "sct", "sctglm"), sets.bar.color = "#56B4E9",
order.by = "freq")

La normalisation avec les relative counts ne log-normalise pas contrairement à toutes les autres. C’est donc normal qu’on trouve un set de gènes spécifique de cette normalisation. On peut essayer de relancer l’analyse en prenant le log des counts ou on peut ignorer cette méthode également.

Si on ignore

upset(df, sets = c("ln", "clrf", "clrc", "sct", "sctglm"), sets.bar.color = "#56B4E9",
order.by = "freq")

Si on prend les logs.

(A rajouter)

On peut voir que dans la globalité, la normalisation n’a à priori pas énormément d’impact sur les analyses à postériori


Points à améliorer :

  • Utiliser un jeu de donnée où on connait les groupes (ex : Tumeur/sain) pour voir si on garde la séparation sur la UMAP
  • Faire des analyses quantitatives (Besoin du premier point pour ça)
  • La méthode de normalisation à utiliser dépend aussi du jeu de données et de ce qu’on compte en faire (integration de plusieurs jeux de données, …)
sessionInfo()
## R version 4.2.1 (2022-06-23)
## Platform: x86_64-apple-darwin17.0 (64-bit)
## Running under: macOS Big Sur ... 10.16
## 
## Matrix products: default
## BLAS:   /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRblas.0.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRlapack.dylib
## 
## locale:
## [1] fr_FR.UTF-8/fr_FR.UTF-8/fr_FR.UTF-8/C/fr_FR.UTF-8/fr_FR.UTF-8
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] UpSetR_1.4.0       glmGamPoi_1.8.0    sctransform_0.3.5  viridis_0.6.2     
##  [5] viridisLite_0.4.1  cowplot_1.1.1      forcats_0.5.2      stringr_1.4.1     
##  [9] dplyr_1.0.10       purrr_0.3.5        readr_2.1.3        tidyr_1.2.1       
## [13] tibble_3.1.8       ggplot2_3.3.6      tidyverse_1.3.2    sp_1.5-0          
## [17] SeuratObject_4.1.2 Seurat_4.2.0      
## 
## loaded via a namespace (and not attached):
##   [1] readxl_1.4.1                backports_1.4.1            
##   [3] plyr_1.8.7                  igraph_1.3.5               
##   [5] lazyeval_0.2.2              splines_4.2.1              
##   [7] listenv_0.8.0               scattermore_0.8            
##   [9] GenomeInfoDb_1.32.4         digest_0.6.30              
##  [11] htmltools_0.5.3             fansi_1.0.3                
##  [13] magrittr_2.0.3              tensor_1.5                 
##  [15] googlesheets4_1.0.1         cluster_2.1.4              
##  [17] ROCR_1.0-11                 tzdb_0.3.0                 
##  [19] globals_0.16.1              modelr_0.1.9               
##  [21] matrixStats_0.62.0          spatstat.sparse_3.0-0      
##  [23] colorspace_2.0-3            rvest_1.0.3                
##  [25] ggrepel_0.9.1               haven_2.5.1                
##  [27] xfun_0.34                   RCurl_1.98-1.9             
##  [29] crayon_1.5.2                jsonlite_1.8.3             
##  [31] progressr_0.11.0            spatstat.data_3.0-0        
##  [33] survival_3.4-0              zoo_1.8-11                 
##  [35] glue_1.6.2                  polyclip_1.10-4            
##  [37] gtable_0.3.1                gargle_1.2.1               
##  [39] zlibbioc_1.42.0             XVector_0.36.0             
##  [41] leiden_0.4.3                DelayedArray_0.22.0        
##  [43] future.apply_1.9.1          BiocGenerics_0.42.0        
##  [45] abind_1.4-5                 scales_1.2.1               
##  [47] DBI_1.1.3                   spatstat.random_2.2-0      
##  [49] miniUI_0.1.1.1              Rcpp_1.0.9                 
##  [51] xtable_1.8-4                reticulate_1.26            
##  [53] spatstat.core_2.4-4         stats4_4.2.1               
##  [55] htmlwidgets_1.5.4           httr_1.4.4                 
##  [57] RColorBrewer_1.1-3          ellipsis_0.3.2             
##  [59] ica_1.0-3                   farver_2.1.1               
##  [61] pkgconfig_2.0.3             sass_0.4.2                 
##  [63] uwot_0.1.14                 dbplyr_2.2.1               
##  [65] deldir_1.0-6                utf8_1.2.2                 
##  [67] labeling_0.4.2              tidyselect_1.2.0           
##  [69] rlang_1.0.6                 reshape2_1.4.4             
##  [71] later_1.3.0                 munsell_0.5.0              
##  [73] cellranger_1.1.0            tools_4.2.1                
##  [75] cachem_1.0.6                cli_3.4.1                  
##  [77] generics_0.1.3              broom_1.0.1                
##  [79] ggridges_0.5.4              evaluate_0.17              
##  [81] fastmap_1.1.0               yaml_2.3.6                 
##  [83] goftest_1.2-3               knitr_1.40                 
##  [85] fs_1.5.2                    fitdistrplus_1.1-8         
##  [87] RANN_2.6.1                  sparseMatrixStats_1.8.0    
##  [89] pbapply_1.5-0               future_1.28.0              
##  [91] nlme_3.1-160                mime_0.12                  
##  [93] xml2_1.3.3                  compiler_4.2.1             
##  [95] rstudioapi_0.14             plotly_4.10.0              
##  [97] png_0.1-7                   spatstat.utils_3.0-1       
##  [99] reprex_2.0.2                bslib_0.4.0                
## [101] stringi_1.7.8               highr_0.9                  
## [103] rgeos_0.5-9                 lattice_0.20-45            
## [105] Matrix_1.5-1                vctrs_0.5.0                
## [107] pillar_1.8.1                lifecycle_1.0.3            
## [109] spatstat.geom_3.0-3         lmtest_0.9-40              
## [111] jquerylib_0.1.4             RcppAnnoy_0.0.20           
## [113] bitops_1.0-7                data.table_1.14.4          
## [115] irlba_2.3.5.1               GenomicRanges_1.48.0       
## [117] httpuv_1.6.6                patchwork_1.1.2            
## [119] R6_2.5.1                    promises_1.2.0.1           
## [121] KernSmooth_2.23-20          gridExtra_2.3              
## [123] IRanges_2.30.1              parallelly_1.32.1          
## [125] codetools_0.2-18            MASS_7.3-58.1              
## [127] assertthat_0.2.1            SummarizedExperiment_1.26.1
## [129] withr_2.5.0                 GenomeInfoDbData_1.2.8     
## [131] S4Vectors_0.34.0            mgcv_1.8-41                
## [133] parallel_4.2.1              hms_1.1.2                  
## [135] grid_4.2.1                  rpart_4.1.19               
## [137] DelayedMatrixStats_1.18.2   rmarkdown_2.17             
## [139] MatrixGenerics_1.8.1        googledrive_2.0.0          
## [141] Rtsne_0.16                  Biobase_2.56.0             
## [143] shiny_1.7.3                 lubridate_1.8.0